package control

import (
	"admin/src/global"
	"admin/src/log"
	"admin/src/models"
	"admin/src/request"
	"admin/src/res"
	"admin/src/response"
	"fmt"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

type MenuController struct{}

func (*MenuController) CreateMenu(c *gin.Context) {
	var req models.MenuModel
	if err := c.ShouldBind(&req); err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("参数错误", zap.Error(err))
		return
	}
	result := global.DB.Where("name = ?", req.Name).First(&req)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("菜单已存在", zap.Error(result.Error))
		return
	}

	result = global.DB.Create(&req)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("创建失败", zap.Error(result.Error))
		return
	}
	res.Ok[models.MenuModel](c, req)
}

func (*MenuController) GetMenusList(c *gin.Context) {
	var req request.PageRequest[models.MenuModel]
	var menusList []models.MenuModel
	var total int64
	if err := c.ShouldBind(&req); err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("参数错误", zap.Error(err))
		return
	}
	result := global.DB.Where(req).Where(req.Data).Find(&menusList)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("", zap.Error(result.Error))
		return
	}
	res.Ok(c, response.ResData[models.MenuModel]{
		Data:  menusList,
		Total: total,
	})
}

func (*MenuController) UpdateMenu(c *gin.Context) {
	var req models.MenuModel
	err := c.ShouldBind(&req)
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("", zap.Error(err))
		return
	}
	result := global.DB.Model(&models.MenuModel{}).Where("id = ?", req.ID).Updates(req)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("更新失败", zap.Error(result.Error))
		return
	}
	res.Ok(c, req)
}

func (*MenuController) DeleteMenu(c *gin.Context) {
	tx := global.DB.Begin()
	var ids []int
	err := c.ShouldBind(&ids)
	if err != nil {
		res.ErrorMsg(c, err.Error())
		log.Logger.Error("参数错误", zap.Error(err))
		tx.Rollback()
		return
	}
	result := tx.Delete(&models.MenuModel{}, ids)
	if result.Error != nil {
		res.ErrorMsg(c, result.Error.Error())
		log.Logger.Error("删除失败", zap.Error(result.Error))
		return
	}
	res.Ok(c, fmt.Sprintf("成功删除了%d条数据", result.RowsAffected))
	tx.Commit()
}
